package py.com.sole.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import py.com.sole.dao.AlumnoDao;
import py.com.sole.dao.DaoFactory;
import py.com.sole.dto.AlumnoPersonaDTO;
import py.com.sole.model.Alumno;
import py.com.sole.model.Direccion;
import py.com.sole.model.Institucion;
import py.com.sole.model.TipoDocumento;
import py.com.sole.solesys.PadreBean;

public class AlumnoImpl implements AlumnoDao {

  EntityManager em = DaoFactory.getEmDao();

  @Override
  public Alumno addAlumno(Alumno alumno) {
    try {
      em.getTransaction().begin();
      em.merge(alumno);
      em.getTransaction().commit();
      em.refresh(alumno);
      return alumno;
    } catch (Exception e) {
      System.out.println("No se pudo insertar el alumno " + e);
      return null;
    }
  }

  @Override
  public boolean deleteAlumno(int id) {
    try {
      em.getTransaction().begin();
      em.remove(em.find(Alumno.class, id));
      em.getTransaction().commit();
      return true;
    } catch (Exception e) {
      return false;
    }

  }

  @Override
  public void updateAlumno(Alumno alumno) {
    // TODO Auto-generated method stub

  }

  @Override
  public List<Alumno> getAlumnos() {
    List<Alumno> alumnos = new ArrayList<Alumno>();
    try {
      alumnos = em.createNamedQuery("Alumno.findAll").getResultList();
    } catch (Exception e) {
    }
    return alumnos;
  }

  @Override
  public List<Alumno> filtrarAlumnos(String busqueda) {
    List<Alumno> alumnos = new ArrayList<Alumno>();
    try {

      Query query = em.createQuery("Select a from Alumno a where UPPER(a.persona.nombre) like :nombre or UPPER(a.persona.apellido) like :nombre  ");
      query.setParameter("nombre", "%" + busqueda.toUpperCase() + "%");
      alumnos = query.getResultList();
      if (null == alumnos || alumnos.size() == 0) {
        System.out.println("Filtrar Alumnos: " + busqueda + " no tiene registros");

      }

    } catch (Exception e) {
      System.out.println("Error: " + e.toString());
    }
    return alumnos;
  }

  @Override
  public Alumno getAlumnoById(int id) {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public Alumno getAlumnoByName(String value) {
    // TODO Auto-generated method stub
    try {
      Query q = em.createNamedQuery("Alumno.findByDescripcion");
      q.setParameter("descripcion", value);
      return (Alumno) q.getSingleResult();
    } catch (Exception e) {
      return null;
    }

  }

  @Override
  public List<AlumnoPersonaDTO> getAlumnoPersona() {
    List<AlumnoPersonaDTO> listAlumno = new ArrayList<AlumnoPersonaDTO>();
    try {
      List<Object[]> listObject = em.createNamedQuery("Alumno.findAlumnoPersona").getResultList();
      for (Object[] objects : listObject) {
        AlumnoPersonaDTO alumno = new AlumnoPersonaDTO();
        alumno.setId(Integer.parseInt(objects[0].toString()));
        alumno.setNombre(objects[1].toString());
        alumno.setApellido(objects[2].toString());
        alumno.setInstitucion((Institucion) objects[3]);
        alumno.setTelefono(objects[4].toString());
        alumno.setEmail(objects[5].toString());
        listAlumno.add(alumno);
      }
    } catch (Exception e) {

    }

    return listAlumno;
  }

  @Override
  public Alumno addAlumno(Alumno alumno, TipoDocumento tipoDocu, List<PadreBean> padres, Direccion direccion, Institucion institucion) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }

}
